﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaEmail
    {
        #region Variaveis Membro
        private int _idPessoaEmail;
        //private int _idPessoa;
        private Pessoa _pessoa;
        private string _email;
        private TipoEmail _tipoEmail;
        private Status _status;
        private GENTEEntities _context;
        #endregion

        #region Propriedades
        public int IdPessoaEmail
        {
            get { return _idPessoaEmail; }
            set { _idPessoaEmail = value; }
        }
        //public int IdPessoa
        //{
        //    get { return _idPessoa; }
        //    set { _idPessoa = value; }
        //}
        public Pessoa Pessoa
        {
            get { return _pessoa; }
            set { _pessoa = value; }
        }
        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }
        public TipoEmail TipoEmail
        {
            get { return _tipoEmail; }
            set { _tipoEmail = value; }
        }
        public Status Status
        {
            get { return _status; }
            set { _status = value; }
        }
        #endregion

        #region Construtores
        public PessoaEmail()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaEmail(int idPessoaEmail)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idPessoaEmail);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idPessoaEmail)
        {
            try
            {
                var consulta = from pe in _context.tab_pessoa_email
                               where pe.Id_email == idPessoaEmail
                               select new
                               {
                                   pe.Id_email,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.email,
                                   pe.tab_tipo_email.id_tipo_email,
                                   pe.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idPessoaEmail = list.Id_email;
                    this._pessoa = new Pessoa(list.Id_pessoa);
                    this._email = list.email;
                    this._tipoEmail = new TipoEmail(list.id_tipo_email);
                    this._status = new Status(list.id_status);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos
        public List<PessoaEmail> SelectAll()
        {
            try
            {
                List<PessoaEmail> listEmail = new List<PessoaEmail>();

                var consulta = from pe in _context.tab_pessoa_email
                               select new
                               {
                                   pe.Id_email,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.email,
                                   pe.tab_tipo_email.id_tipo_email,
                                   pe.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaEmail pessoaEmail = new PessoaEmail();
                    pessoaEmail.IdPessoaEmail = list.Id_email;
                    pessoaEmail.Pessoa = new Pessoa(list.Id_pessoa);
                    pessoaEmail.Email = list.email;
                    pessoaEmail.TipoEmail = new TipoEmail(list.id_tipo_email);
                    pessoaEmail.Status = new Status(list.id_status);

                    listEmail.Add(pessoaEmail);
                }

                return listEmail;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaEmail> SelectPessoa(string nome)
        {
            try
            {
                List<PessoaEmail> listEmail = new List<PessoaEmail>();

                var consulta = from pe in _context.tab_pessoa_email
                               join p in _context.tab_pessoa on pe.tab_pessoa.Id_pessoa equals p.Id_pessoa
                               where ((nome != "") ? p.nome_completo.Contains(nome) : 1 == 1)
                               select new
                               {
                                   pe.Id_email,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.email,
                                   pe.tab_tipo_email.id_tipo_email,
                                   pe.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaEmail pessoaEmail = new PessoaEmail();
                    pessoaEmail.IdPessoaEmail = list.Id_email;
                    pessoaEmail.Pessoa = new Pessoa(list.Id_pessoa);
                    pessoaEmail.Email = list.email;
                    pessoaEmail.TipoEmail = new TipoEmail(list.id_tipo_email);
                    pessoaEmail.Status = new Status(list.id_status);

                    listEmail.Add(pessoaEmail);
                }

                return listEmail;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaEmail> SelectPorGrupo(int idGrupoEmail)
        {
            try
            {
                List<PessoaEmail> listEmail = new List<PessoaEmail>();

                var consulta = from pe in _context.tab_pessoa_email
                               join ege in _context.tab_email_grupo_email on pe.Id_email equals ege.tab_pessoa_email.Id_email
                               join ge in _context.tab_grupo_email on ege.tab_grupo_email.Id_grupo_email equals ge.Id_grupo_email
                               where ge.Id_grupo_email == idGrupoEmail
                               select new
                               {
                                   pe.Id_email,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.email,
                                   pe.tab_tipo_email.id_tipo_email,
                                   pe.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaEmail pessoaEmail = new PessoaEmail();
                    pessoaEmail.IdPessoaEmail = list.Id_email;
                    pessoaEmail.Pessoa = new Pessoa(list.Id_pessoa);
                    pessoaEmail.Email = list.email;
                    pessoaEmail.TipoEmail = new TipoEmail(list.id_tipo_email);
                    pessoaEmail.Status = new Status(list.id_status);

                    listEmail.Add(pessoaEmail);
                }

                return listEmail;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
